package com.feiyu.Interceptor;


import com.alibaba.fastjson.JSONObject;
import com.feiyu.util.JwtUtils;
import com.feiyu.util.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
@Component        //自定义拦截器
public class LoginCheckInterceptor implements HandlerInterceptor {
    /**
     * spring 框架里面的
     */

    @Override      //true  放行  false  不放行
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {

        //获取请求头
        String requestURL = httpServletRequest.getRequestURL().toString();
        log.info("请求：{}" + requestURL);

        //判断是否是登录请求,是--放行
        if (requestURL.contains("/login")) {
            //放行
            return true;  //结束方法
        }

        //  如果不是，获取请求中的token
        String token = httpServletRequest.getHeader("token");
        log.info("token：{}" + token);

        //判断token  是否存在    不存在 返回错误信息
        if (!StringUtils.hasLength(token)) {
            log.info("token不存在");


            Result error = Result.error("NOT_LOGIN");
            //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)

            String JSON = JSONObject.toJSONString(error);
            //响应
            httpServletResponse.getWriter().write(JSON);

            return false;  //结束方法--不放行
        }

        // 校验jwt    存在 --- 判断token 是否正确      正确 放行，错误返回错误信息

        try {
            JwtUtils.parseJWT(token);
        } catch (Exception e) {
            log.info("解析失败");
            //返回数据
            Result error = Result.error("NOT_LOGIN");
            //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)

            String JSON = JSONObject.toJSONString(error);
            //响应
            httpServletResponse.getWriter().write(JSON);

            return false;
        }
        //放行
        return  true;

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
